package com.atguigu.tingshu.user.service.impl;

import com.alibaba.fastjson.JSON;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.common.util.MongoUtil;
import com.atguigu.tingshu.model.user.UserListenProcess;
import com.atguigu.tingshu.user.service.UserListenProcessService;
import com.atguigu.tingshu.vo.album.TrackStatMqVo;
import com.atguigu.tingshu.vo.user.UserListenProcessVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Service
@SuppressWarnings({"all"})
public class UserListenProcessServiceImpl implements UserListenProcessService {
	@Autowired
	private MongoTemplate mongoTemplate;
	@Autowired
	private RedisTemplate redisTemplate;
	@Autowired
	private RabbitService rabbitService;

	@Override
	public BigDecimal getTrackBreakSecond(Long userId, Long trackId) {
		//	根据用户Id,声音Id获取播放进度对象  构造mongoTemplate查询条件
		Query query = new Query(Criteria.where("userId").is(userId).and("trackId").is(trackId));
		//查询mongoDB
		UserListenProcess processOne = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
		//判断结果非空 非空结果 取结果集内的秒数返回
		if (null!=processOne) {
			return processOne.getBreakSecond();
		}
		//判断结果为空  返回0
		return new BigDecimal("0");
	}

	/**
	 * 更新播放进度
	 *
	 * @param userId
	 * @param userListenProcessVo
	 */
	@Override
	public void updateListenProcess(Long userId, UserListenProcessVo userListenProcessVo) {
		// 根据用户Id，声音Id 设置查询条件
		Query query = new Query(Criteria.where("userId").is(userId).and("trackId").is(userListenProcessVo.getTrackId()));
		//根据query条件查询MongoDB集合 赋值给UserListenProcess.class
		UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
		//判断结果非空 赋值前端传入的播放时间到结果集中
		if (null!=userListenProcess) {
			//	设置跳出时间
			userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());
			//	设置更新时间
			userListenProcess.setCreateTime(new Date());
		}else { //查询结果为空 创建一个新的对象 赋值前端传入的信息
			userListenProcess = new UserListenProcess();
			//赋值前端传入的数据
			userListenProcess.setUserId(userId); //用户id
			userListenProcess.setAlbumId(userListenProcessVo.getAlbumId()); //专辑id
			userListenProcess.setTrackId(userListenProcessVo.getTrackId());//声音id
			userListenProcess.setBreakSecond(userListenProcessVo.getBreakSecond());//	设置跳出时间
			userListenProcess.setIsShow(1);//是否显示
			userListenProcess.setCreateTime(new Date());//设置创建时间
			userListenProcess.setUpdateTime(new Date());//设置更新时间
		}
		//save统一保存或修改
		mongoTemplate.save(userListenProcess, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));

		//	控制，当前同一个用户，在规定时间内(24h)，不能重复累加播放次数！ redis --- setnx
		String key = "userId:"+userId+";trackId:"+userListenProcessVo.getTrackId();
		Boolean flag = redisTemplate.opsForValue().setIfAbsent(key, 1, 24, TimeUnit.HOURS);
		if (flag) {
			//	设置成功，可以累加播放次数track_stat！ 间接要更新专辑的播放;album_stat
			TrackStatMqVo trackStatMqVo = new TrackStatMqVo();
			//	业务编号，防止消息重复消费!
			trackStatMqVo.setBusinessNo(UUID.randomUUID().toString().replaceAll("-",""));
			trackStatMqVo.setAlbumId(userListenProcessVo.getAlbumId());
			trackStatMqVo.setTrackId(userListenProcessVo.getTrackId());
			trackStatMqVo.setStatType(SystemConstant.TRACK_STAT_PLAY);
			trackStatMqVo.setCount(1);
			//	异步发送消息，更新专辑-声音播放量
			rabbitService.sendMessage(MqConst.EXCHANGE_TRACK,MqConst.ROUTING_TRACK_STAT_UPDATE, JSON.toJSONString(trackStatMqVo));
		}
	}

	/**
	 * 获取最近播放声音
	 * @param userId
	 * @return
	 */
	@Override
	public Map<String, Object> getLatelyTrack(Long userId) {
		//	获取声音列表
		//	Query query = Query.query(Criteria.where("userId").is(userId)).with(Sort.by(Sort.Direction.DESC, "updateTime"));
		Query query = new Query().with(Sort.by(Sort.Direction.DESC, "updateTime"));
		// 按照条件查询数据并返回结果  无需在query中指定用户id 查询的mongoDB集合为用户id命名，在生成集合名时已确认了 指定用户
		UserListenProcess userListenProcess = mongoTemplate.findOne(query, UserListenProcess.class, MongoUtil.getCollectionName(MongoUtil.MongoCollectionEnum.USER_LISTEN_PROCESS, userId));
		// 声明一个map 集合
		Map<String, Object> map = new HashMap<>();
		//	判断返回的结果非空
		if (null!=userListenProcess) {
			//	封装数据
			map.put("albumId",userListenProcess.getAlbumId());
			map.put("trackId",userListenProcess.getTrackId());
			//返回结果
			return map;
		}
		//返回的结果为空 返回未封装数据的map
		return map;
	}
}
